package cn.micai.queue;

import java.util.concurrent.CountDownLatch;

/**
 * 在时序测试中，使用CountDownLatch来启动和停止线程
 */
public class TestHarness {

    public long timeTasks(int nThreads, final Runnable task) {
        // 开始阀门 计数器初始化为1
        final CountDownLatch startGate = new CountDownLatch(1);
        // 结束阀门 计数器初始化为工程线程的数量
        final CountDownLatch endGate = new CountDownLatch(nThreads);

        for (int i=0; i<nThreads; i++) {
            Thread t = new Thread() {
                @Override
                public void run() {
                    try {
                        // 每一个工作线程要做的第一件事情是等待开始阀门打开，这样做能确保所有线程都做好准备时，才开始工作
                        startGate.await();
                        try {
                            task.run();
                        } finally {
                            // 每个线程的最好一个工作是为结束阀门减一，这样做控制线程有效地等待，直到最后一个工程线程完成任务，
                            // 这样就能计算整个的用时了
                            endGate.countDown();
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            t.start();
        }

        long start = System.nanoTime();
        startGate.countDown();

        long end = System.nanoTime();

        return end - start;
    }


}
